1   package uba.db.sql.server;
2   
3   import java.io.BufferedReader;
4   import java.io.InputStreamReader;
5   import java.io.PrintWriter;
6   import java.net.InetSocketAddress;
7   import java.net.Socket;
8   
9   import uba.db.testhelpers.TestUtils;
10  
11  import junit.framework.TestCase;
12  
13  /***
14   * Test de unidad para {@link Server}.
15   * 
16   * @version $Revision: 1.1 $
17   */
18  public class ServerTest extends TestCase {
19      private Server server;
20      private static final String TEST_SERVER_HOST = "localhost";
21      private static final int TEST_SERVER_PORT = 5000;
22  
23      /***
24       * @see junit.framework.TestCase#setUp()
25       */
26      protected void setUp() throws Exception {
27          super.setUp();
28          server = new Server(new InetSocketAddress(TEST_SERVER_HOST, TEST_SERVER_PORT),
29                  TestUtils.tempDirectory());
30      }
31  
32      /***
33       * @see junit.framework.TestCase#tearDown()
34       */
35      protected void tearDown() throws Exception {
36          if (server.isRunning()) {
37              server.stop();
38          }
39      }
40  
41      /***
42       * Test: iniciar el servidor y verificar si el mismo esta corriendo
43       */
44      public void testStart() throws ServerAlreadyRunningException {
45          try {
46              server.start();
47          } catch (ServerStartUpException e) {
48              fail("no se pudo iniciar el servidor");
49          }
50  
51          assertTrue("el server deberia estar en ejecución", server.isRunning());
52      }
53  
54      /***
55       * Test: conectarse al servidor desde un cliente
56       */
57      public void testConnectFromClient() throws Exception {
58          Socket clientSocket = null;
59  
60          server.start();
61  
62          try {
63              clientSocket = new Socket(TEST_SERVER_HOST, TEST_SERVER_PORT);
64          } catch (Exception e) {
65              fail("fallo la conexion al servidor");
66          }
67          assertTrue(clientSocket.isConnected());
68          clientSocket.close();
69          assertTrue("el server deberia seguir en ejecución", server.isRunning());
70      }
71  
72      /***
73       * Test: cuando el server no esta en ejecución {@link Server#isRunning} debe
74       * ser <i>false</i>.
75       */
76      public void testIsRunning() throws Exception {
77          assertFalse(server.isRunning());
78      }
79  
80      /***
81       * Test: espera que el server termine (quizas la mejor forma es utilizar un
82       * observer sobre el server y no esperar una notificacion al monitor del
83       * objeto, por ahora con la notificacion alcanza).
84       */
85      public void testServerFinalizationNotification() throws Exception {
86          server.start();
87          new Thread(new Runnable() {
88              public void run() {
89                  try {
90                      // espera un rato
91                      Thread.sleep(200);
92                      // y para el servidor
93                      server.stop();
94                  } catch (Exception e) {
95                      // la excepciones no importan por que si suben para arriba
96                      // estan en otro thread y nunca llegan al thread del test
97                  }
98              }
99          }).start();
100 
101         synchronized (server) {
102             server.wait(1000);
103         }
104 
105         assertFalse("paso el tiempo de espera y no se notifico el cambio en el server",
106                     server.isRunning());
107     }
108 
109     /***
110      * Test: al ejecutar un SELECT se debe retornar algun resultado.
111      */
112     public void testExecuteSelect() throws Exception {
113         server.start();
114         Socket clientSocket = new Socket(TEST_SERVER_HOST, TEST_SERVER_PORT);
115         PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
116         BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket
117                 .getInputStream()));
118 
119         out.println("SELECT * FROM sys_tables");
120         String oneResult = in.readLine();
121         assertNotNull(oneResult);
122     }
123 
124 }